package execute

//执行

import (
	"fmt"
	"go-word/bwfs"
	"go-word/dss"
	"go-word/po"
	"go-word/sort"
	"go-word/trie"
	"go-word/wsf"
	"strings"
	"sync"
)

// Bwfs 1.执行基础词频统计
func Bwfs() {
	// 读取文件
	text, err := bwfs.ReadFile("bwfs/sample.txt")
	if err != nil {
		fmt.Println("Error reading file:", err)
		return
	}
	// 分词
	words := bwfs.Tokenize(text)

	// 统计词频
	freqMap := bwfs.CountWordFreq(words)

	// 输出结果
	fmt.Println("基础词频统计")
	bwfs.PrintWordFreq(freqMap)
}

// Wsf 2.分词函数
func Wsf() {
	// 测试分词函数
	text := "Hello, World! How are you?"
	tokens := wsf.Tokenize(text)

	// 输出分词结果
	fmt.Println("------------------------------")
	fmt.Println("分词函数")
	fmt.Println("Tokens:")
	for _, token := range tokens {
		fmt.Print(token + " ")
	}
	fmt.Println()
}

// Dss 3.数据存储结构
func Dss() {
	// 创建一个新的单词频率结构
	wf := dss.NewWordFrequency()

	// 测试文本
	text := "Hello, world! This is a test text. Hello world!"

	// 分词并更新频率
	wf.TokenizeAndUpdate(text)

	// 输出单词频率
	fmt.Println("------------------------------")
	fmt.Println("数据存储结构")
	fmt.Println("Word Frequencies:")
	for word, frequency := range wf.FrequencyMap {
		fmt.Printf("%s: %d\n", word, frequency)
	}
}

// Sort 4.词频统计与排序
func Sort() {
	// 创建一个新的单词频率结构
	wf := sort.NewWordFrequency()
	// 测试文本
	text := "Hello, world! This is a test text. Hello world!"
	// 分词并更新频率
	wf.TokenizeAndUpdate(text)
	// 获取排序后的单词列表
	sortedWords := wf.SortByFrequency()
	// 输出排序后的结果
	fmt.Println("------------------------------")
	fmt.Println("词频统计与排序")
	fmt.Println("Sorted Word Frequencies:")
	for _, word := range sortedWords {
		fmt.Println(word, "-", wf.FrequencyMap[word])
	}
}

// Po 5.程序优化：Program optimization
func Po() {
	text := "This is a sample text for tokenization. Tokenization is the process of dividing text into words."
	// 将文本分成多个片段
	segments := strings.Split(text, " ")

	counts := make(map[string]int) // 存储单词计数的映射
	var wg sync.WaitGroup          // 使用sync包的WaitGroup来等待所有goroutine完成

	for _, segment := range segments {
		wg.Add(1) // 每启动一个goroutine，增加等待组的计数
		go po.Tokenize(segment, counts, &wg)
	}

	// 等待所有goroutine完成
	wg.Wait()

	// 输出结果
	fmt.Println("------------------------------")
	fmt.Println("程序优化：使用Go的goroutine实现并发")
	fmt.Println("Word counts:")
	for word, count := range counts {
		fmt.Printf("%s: %d\n", word, count)
	}
}

// Trie 6.使用 Trie 树来优化存储和查找
func Trie() {
	// 创建一个新的Trie树
	trie := trie.NewTrie()

	// 插入一些单词
	words := []string{"apple", "banana", "orange", "grape", "pear"}
	for _, word := range words {
		trie.Insert(word)
	}

	// 测试查找单词
	fmt.Println("------------------------------")
	fmt.Println("使用 Trie 树来优化存储和查找")

	fmt.Println(trie.Search("apple"))  // 输出: true
	fmt.Println(trie.Search("banana")) // 输出: true
	fmt.Println(trie.Search("kiwi"))   // 输出: false

	// 测试查找前缀
	fmt.Println(trie.StartsWith("app")) // 输出: true
	fmt.Println(trie.StartsWith("ki"))  // 输出: false
}
